package 每日一题;

import publicClass.ListNode;

import java.util.Stack;

/**
 * 445. 两数相加 II
 * 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数字都不会以零开头。
 *
 *
 *
 * 示例1：
 *
 *
 *
 * 输入：l1 = [7,2,4,3], l2 = [5,6,4]
 * 输出：[7,8,0,7]
 * 示例2：
 *
 * 输入：l1 = [2,4,3], l2 = [5,6,4]
 * 输出：[8,0,7]
 * 示例3：
 *
 * 输入：l1 = [0], l2 = [0]
 * 输出：[0]
 *
 *
 * 提示：
 *
 * 链表的长度范围为 [1, 100]
 * 0 <= node.val <= 9
 * 输入数据保证链表代表的数字无前导 0
 *
 */
public class T445_两数相加II {
    //使用栈 先入栈 再出栈 相加
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode preHeadL1 = new ListNode(0,l1);
        ListNode preHeadL2 = new ListNode(0,l2);
        Stack<ListNode> stack1 = new Stack<>();
        Stack<ListNode> stack2 = new Stack<>();

        while (l1!=null){
            stack1.add(l1);
            l1 = l1.next;
        }

        while (l2!=null){
            stack2.add(l2);
            l2 = l2.next;
        }


        //保存进位
        int temp = 0;
        while (stack2.size()>0&&stack1.size()>0) {

            ListNode l2Node = stack2.pop();
            ListNode l1Node = stack1.pop();

            int i = l1Node.val + l2Node.val + temp;

            //进位
            temp = i/10;
            //写入节点的值
            int val = i%10;

            l1Node.val = val;
            l2Node.val = val;
        }


        //重新找到头节点
        ListNode head;
        if (stack2.size()>0){
            head = preHeadL2.next;
        }else {
            head = preHeadL1.next;
        }

        while (stack1.size()>0){
            ListNode listNode = stack1.pop();
            int i = listNode.val + temp;
            //进位
            temp = i/10;
            //写入节点的值
            listNode.val = i%10;
        }
        while (stack2.size()>0){
            ListNode listNode = stack2.pop();
            int i = listNode.val + temp;
            //进位
            temp = i/10;
            //写入节点的值
            listNode.val = i%10;
        }


        if (temp>0){
            head = new ListNode(temp, head);
        }

        return head;
    }
}
